/**
 * @desc ajax 封装
 */
import axios from 'axios'
import router from '@/router'
import {
    newWorkConfig,
    ERROR_REQUEST_STATYS,
	SUCCESS_REQUEST_STATUS
} from './config.js'
// 默认导出去
export default {
    install(Vue) {
        // 默认配置参数
        const DEFAULT_API_CONFIG = {
            api: '',                // 接口地址
            type: 'POST',           // 请求接口类型 默认POST
            params: {},             // 默认请求参数
        }
        // 定义名称 options 请求参数
        Vue.prototype.$ajax = ((options) => {
            // 合并参数
            let mergeParams = Object.assign({},DEFAULT_API_CONFIG, options)
            // contentType 类型
            let contentType = mergeParams.contentType ? 'application/json': 'application/x-www-form-urlencoded' 
            // 合并请求接口地址
            let urls = mergeParams.type == 'GET' ? `${newWorkConfig.pro_url}${options.api}${mergeUrl(mergeParams)}` : `${newWorkConfig.pro_url}${options.api}`
            // 返回promise
            return new Promise((reslove, reject) => {
                axios({
                    url: urls,
                    method: mergeParams.type,
                    transformRequest: [(data) => {
                        /**
                         *  @desc 处理请求参数 
                         *  handleGetParamFn 处理get请求 handleParams 处理post请求  contentType如果存在就是处理json格式的数据
                         *  @TODO 其他类型还没处理 例如get forData 后续改进
                         */
                        return mergeParams.type == 'GET' ? handleGetParamFn(mergeParams.params) : mergeParams.contentType ? JSON.stringify(mergeParams.params) : handleParams(mergeParams.params)
                    }],
                    headers: {
						'Content-Type': contentType
					}
                }).then(res => {
                    // 判断请求接口请求码
                    switch(res.data.code) {
                        case SUCCESS_REQUEST_STATUS :
                            reslove({
                                data: res.data.data,
                                code: 200,
                            }) 
                        break;
                        default :
                            reject({
                                message: res.data.msg,
                                code: ERROR_REQUEST_STATYS,
                            })
                        break;
                    }
                }).catch((err) => {
                    // 服务器报错
                    reject({
                        code: 400,
                        message: '服务器报错'
                    })
                })
            })
        })
    }
}
const handleGetParamFn = (mergeParams) => {
    let ret = ''
    for (let it in mergeParams.params) {
        ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
    }
    return ret
}


/**
 * 	@author yang 
 *	@param param 请求的参数
 * 	@return 返回拼接后的参url参数
 */
const mergeUrl = (options) => {
	let url = ''
	for (let k in options.params) {
		let value = options.params[k] !== undefined ? options.params[k] : ''
		url += '&' + k + '=' + encodeURIComponent(value)
	}
	return url ? '?'+url.substring(1) : ''
}
/**
 * @desc 该方法只适合post请求使用
 * @author yang 
 * @param param 请求的参数
 * @return 返回拼接后的参数
 */
const handleParams = (param) => {
	let params = []
	let result = null
	let keys = Object.keys(param)
	for (let i = 0, len = keys.length; i < len; i++) {
		if (param[keys[i]] !== undefined && param[keys[i]] !== null) {
			param[keys[i]] = encodeURIComponent(param[keys[i]])
			params.push(keys[i] + '=' + param[keys[i]])
		}
	}
	result = params.join('&')
	return result
}